
import java.awt.Color;
import java.awt.Graphics;

/**
 * Questa e' la classe che gestisce le pupille. Questa classe contiene una pupilla con i metodi per disegnarla e spostarla
 * 
 * @author Simoncelli Davide && Beschi Jacopo
 */

public class Pupilla {
        
        /**
         * Variabili che identificano la posizione della pupilla
         */
        
        private int x, y;
        
        /**
         * Centro dell'occhio dove posizionare la pupilla
         */
        
        private int xCentro, yCentro;
        
        /**
         * Diametro della pupilla
         */
        
        private int diametro;
        
        /** 
         * Costruttore della classe che inizializza la posizione della pupilla
         * 
         * @param _x La posizione della pupilla a partire da sx in pixel 
         * @param _y La posizione della pupilla a partire dal'alto  in pixel
         * @param _diametro Il diametro della pupilla
         */
        
        public Pupilla(int _x, int _y, int _diametro) {
                x= _x;
                y = _y;
                xCentro = x;
                yCentro = y;
                diametro=_diametro;
        }

        public void setX(int _x) {
                xCentro = _x;
        }
        
        public void setY(int _y) {
                yCentro = _y;
        }
        
        /**
         * Stampa l'oggetto pupilla
         * 
         * @param g oggetto Graphics su cui stampare
         */
        
        public void paint(Graphics g) {
                g.setColor(Primo.colorePupilla);
                g.fillOval(x, y, diametro, diametro);
                g.setColor(Color.BLACK);
                int diamInterno = diametro*2/3;
                g.fillOval(x+diametro/2 - diamInterno/2, y+diametro/2 - diamInterno/2, diamInterno, diamInterno);
        }
        
        /**
         * Metodo che permette di fare seguire gli occhi con il mouse.  
         * 
         * @param xMouse posizione x del mouse
         * @param yMouse posizione y del mouse
         */
        public void seguiMouse(int xMouse, int yMouse)
        {
                double ipotenusa, distanzax,distanzay, seno, coseno;
                int  xPupp, yPupp;
                ipotenusa = Math.sqrt(Math.pow(xCentro - xMouse,2)+Math.pow(yCentro - yMouse,2));
                distanzax = (xMouse-xCentro);
                coseno = distanzax/ipotenusa;
                distanzay = (yMouse-yCentro);
                seno = distanzay/ipotenusa;
                
                // Calcolo il semiasse maggiore dell'ellisse
                double a = Math.pow(Primo.wOcchio/2-diametro/2,2);
                // Calcolo il semiasse minore dell'ellisse
                double b = Math.pow(Primo.hOcchio/2-diametro/2,2);
                
                // Verifico se mi trovo dentro o fuori alla pupilla
                if(Math.pow(xMouse-xCentro- diametro/2,2)/a+Math.pow(yMouse-yCentro - diametro/2,2)/b <= 1) {
                        // tolgo diametro /2 per correggere l'e errore di posizionamento
                        xPupp = (int) xMouse -diametro/2;
                        yPupp = (int) yMouse -diametro/2;
                }
                else {
                        xPupp = (int) ((Primo.wOcchio/2 -diametro/2)*coseno)+xCentro;
                        yPupp = (int)((Primo.hOcchio/2- diametro/2)*seno)+yCentro;
                }
                
                sposta(xPupp,yPupp);
        } //seguiMouse(int xMouse, int yMouse)
        
        
        
        /**
         * Sposta la pupilla a destro o a sinistra e in alto o in basso
         * 
         * @param _x Spostamento a destra di _x pixel
         * @param _y Spostamento in basso di _y pixel
         */
        
        public void muovi(int _x, int _y) {
                x += _x;
                y += _y;
        }
        
        /**
         * Posiziona la pupilla alle coordinate specificate
         *  
         * @param _x nuova posizione x in cui spostare la pupilla
         * @param _y nuova posizione y in cui spostare la pupilla
         */
        
        public void sposta(int _x, int _y) {
                x = _x;
                y = _y;
        }
        
} // class
